\subsection{Gestor de enemigos.}

Para la gestión de los zombis en el juego se utiliza la clase ZombieManager. 
Esta clase utiliza el patrón Singleton proporcionado por Ogre, el patrón 
Factory y el patrón Facade, proporcionando una interfaz simple para la 
creación, actualización y eliminación de los enemigos.

La clase se encarga de generar, actualizar y eliminar diferentes objetos que 
representan enemigos, generadores y agrupaciones de enemigos.

Es la responsable además, de crear, mantener y eliminar las formas de colisión 
de los enemigos, lo cual permite la reutilización de dichas formas.

La clase cuenta con tres tipos principales de funciones, las de creación, las 
de actualización y las de eliminación.

Las funciones de creación permiten generar instancias de Zombie, ZombieSwarm y 
ZombieSpawner.

La clase Zombie representa un zombi individual. Esta clase hereda de la clase 
Character, en la que se incluyen algunos atributos que son comunes a los 
diferentes tipos de enemigos, así como al personaje principal (representación 
física y visual).

Llamando al constructor de la clase Zombie con el argumento boss a verdadero 
se crea el zombi jefe. Este cuenta con mayor tamaño, diferente aspecto y mucha 
más vida que el resto de zombis.

La clase Character hereda a su vez de BulletVehicle, por lo que permite que se 
utilicen todas las funciones de la biblioteca de OpenSteer.

Dichas funciones se utilizan en el método update, en el cual se implementa el 
comportamiento que cabe esperar de un zombi (vagar sin rumbo, perseguir humanos 
y formar hordas).

La clase ZombieSwarm representa una horda de zombis. La horda tiene un centro 
que se calcula como la media de la posición de todos los zombis que la forman, 
y una distancia máxima a la que puede alejarse de la horda un zombi que forme 
parte de ella.

La clase ZombieSpawner representa un punto de generación de enemigos. Se indica 
una posición en el espacio, un intervalo de tiempo y un número máximo de zombis 
a generar e irán apareciendo enemigos periódicamente conforme transcurra el 
intervalo de tiempo indicado.

Las funciones de actualización llaman a los metodos de actualización de todas 
las clases anteriores.

En el caso de los zombis, el método update calcula las fuerzas que se aplicaran 
para representar el comportamiento y se anima la representación gráfica.

En el caso de las hordas se recalcula su centro y su distancia máxima (la cual 
depende del número de zombis que queden en la horda).

En el caso de los generadores de zombis, se decrementa el contador de 
generación y si ha transcurrido el intervalo indicado, se genera un nuevo 
enemigo.

El diagrama de clases de ZombieManager y del resto de clases implicadas puede 
consultarse en la figura \ref{ZombieManager}.

\begin{figure}[h]
\centering
\includegraphics[width = 12 cm]{ZombieManager.eps}
\caption{Diagrama de clases de ZombieManager.}
\label{ZombieManager}
\end{figure}

